package generic;

/**
 * @author ChangLiang
 * @date 2021/2/1
 */
class ClassAsFactory<T> {
    T x;

    public ClassAsFactory(Class<T> kind) {
        try {
            x = kind.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

class Employee {
}

public class InstantiateGenericType {
    public static void main(String[] args) {
        ClassAsFactory<Employee> fe = new ClassAsFactory<>(Employee.class);
        System.out.println(fe.x);
        System.out.println("ClassAsFactory<Employee> succeeded");
        try {
            /**
             * 这可以编译，但是会因ClassAsFactory<Integer>而失败，
             * 因为Integer没有任何默认的构造器。
             * 因为这个错误不是在编译期捕获的，所以Sun的伙计们对这种方式并不赞成，
             * 他们建议使用显式的工厂，并将限制其类型，使得只能接受实现了这个工厂的类：
             */
            ClassAsFactory<Integer> fi = new ClassAsFactory<>(Integer.class);
        } catch (Exception e) {
            System.out.println("ClassAsFactory<Integer> failed");
        }
    }
}
